package com.coursehub.progress.repository;

import com.coursehub.progress.entity.StudentMaterial;
import com.coursehub.progress.entity.StudentMaterialId;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 学生资料学习进度数据访问层
 */
@Repository
public interface StudentMaterialRepository extends JpaRepository<StudentMaterial, StudentMaterialId> {
    
    /**
     * 根据用户ID查找所有资料学习进度
     */
    List<StudentMaterial> findByUserId(String userId);
    
    /**
     * 根据资料ID查找所有学生的学习进度
     */
    List<StudentMaterial> findByMaterialId(String materialId);
    
    /**
     * 根据用户ID和资料ID查找学习进度
     */
    Optional<StudentMaterial> findByUserIdAndMaterialId(String userId, String materialId);
    
    /**
     * 根据用户ID和完成状态查找资料学习进度
     */
    List<StudentMaterial> findByUserIdAndIsFinished(String userId, Boolean isFinished);
    
    /**
     * 根据资料ID和完成状态查找学生学习进度
     */
    List<StudentMaterial> findByMaterialIdAndIsFinished(String materialId, Boolean isFinished);
    
    /**
     * 统计用户已完成的资料数量
     */
    @Query("SELECT COUNT(sm) FROM StudentMaterial sm WHERE sm.userId = :userId AND sm.isFinished = true")
    long countCompletedMaterialsByUserId(@Param("userId") String userId);
    
    /**
     * 统计资料的完成人数
     */
    @Query("SELECT COUNT(sm) FROM StudentMaterial sm WHERE sm.materialId = :materialId AND sm.isFinished = true")
    long countCompletedStudentsByMaterialId(@Param("materialId") String materialId);
    
    /**
     * 根据用户ID和资料ID查找已完成的学习进度
     */
    @Query("SELECT sm FROM StudentMaterial sm WHERE sm.userId = :userId AND sm.materialId = :materialId AND sm.isFinished = true")
    Optional<StudentMaterial> findCompletedMaterial(@Param("userId") String userId, @Param("materialId") String materialId);
    
    /**
     * 根据用户ID和资料ID列表查找已完成的学习进度
     */
    List<StudentMaterial> findByUserIdAndMaterialIdInAndIsFinishedTrue(String userId, List<String> materialIds);
    
    /**
     * 根据用户ID列表查找资料学习进度
     */
    List<StudentMaterial> findByUserIdIn(List<String> userIds);
    
    /**
     * 根据资料ID列表查找学习进度
     */
    List<StudentMaterial> findByMaterialIdIn(List<String> materialIds);
    
    /**
     * 删除用户的所有资料学习进度
     */
    void deleteByUserId(String userId);
    
    /**
     * 删除资料的所有学习进度记录
     */
    void deleteByMaterialId(String materialId);
}